package demo1;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

//顺序表 ArrayList  连续的空间，可以动态扩容


public class Test {

    public static void main1(String[] args) {

        ArrayList<Integer> arrayList1 = new ArrayList<>();
        arrayList1.add(1);
        arrayList1.add(2);
        //Ait + 7 快捷键显示类的方法并且转到源代码 或者是CTRL+B转到源代码
        //在第一次add的时候，才会为ArrayList底层的elemData分配内存，且大小为10
        //除了第一次扩容，将数组空间置为10，之后每次扩容都按原长的1.5倍去扩容
    }

    public static void main2(String[] args) {
        ArrayList<Integer> arrayList = new ArrayList<>(10);
        arrayList.add(11);

        ArrayList<Number> arrayList1 = new ArrayList<>(arrayList);
        arrayList1.add(1212);
        System.out.println(arrayList);
        System.out.println(arrayList1);
        //用另外一个实现collection接口的对象作为参数，将其中的数组元素全部复制到该对象当中
        //参数对象指定的类的元素必须为该对象的子类或者是它本身 此处的Integer是Number的子类
    }

    public static void main3(String[] args) {
        ArrayList<Integer> arrayList = new ArrayList<>(10);
        //指定空间大小创建顺序表
    }

    public static void main4(String[] args) {
        ArrayList<Integer> arrayList = new ArrayList<>();
        ArrayList<Integer> arrayList1 = new ArrayList<>();
        arrayList1.add(12);
        arrayList.add(0,10);
        arrayList.addAll(arrayList1);
        //先检查位置是否合法，再检查容量

        arrayList.remove(1);
        //删除指定位置的元素
        arrayList.remove(new Integer(0));
        arrayList.add(null);
        System.out.println(arrayList);
        System.out.println(arrayList.size());
        arrayList.remove(null);
        System.out.println(arrayList);
        System.out.println(arrayList.size());
        arrayList.clear();
        System.out.println(arrayList);
        System.out.println(arrayList.size());
        arrayList.add(112);
        arrayList.add(121);
        arrayList.add(23231);
        arrayList.add(122);
        //删除的都是引用类型，不能传基本类型，基本类型是指定删除元素下标

        //ArrayList的size和elemData.length是一样大的吗？


        List<Integer> sub = arrayList.subList(0,2);
        System.out.println(sub);
        sub.set(0,999);
        System.out.println(sub);
        System.out.println(arrayList);


        //sub截取一部分数据给sub，但是sub和arrayList共用同一个数组
        //对sub的修改也会改变arrayList



    }
    //遍历arrayList sout直接输出，父类重写了toStirng方法
    //for循环输出
    public static void main5(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(12);
        list.add(122);
        list.add(1212);
        list.add(21);
        System.out.println(list);
        System.out.println("+++++++++++++++");
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i) + " ");
        }
        System.out.println();
        System.out.println("+++++++++++++++");
        for (Integer x : list) {
            System.out.print(x + " ");
        }
        System.out.println();
        System.out.println("+++++++++++++++");
        //迭代器--->少用
        ListIterator<Integer> it = list.listIterator();
        while(it.hasNext()) {
            System.out.print(it.next() + " ");
            //打印的同时让it往前走一步
        }
    }

    //ArrayList的扩容机制
    //使用copyOf进行扩容，集合看到grow都是使用copyOf来扩容
    //按照1.5倍扩容，如果大于1.5，按照用户要求扩容。例如创建一个arrayList对象时，如果调用无参构造创建，
    //这个时候数组长度为0，所以这个时候要按照默认大小扩容







}


